Aller au contenu principal

5. Questionnaire Satisfaction

Plateforme Django de questionnaires de satisfaction étudiante avec tableaux de bord analytiques

Période de développement : Mars 2022 - Mai 2022 (3 mois)

🎯 Niveau de difficulté : 3/5

  • Projet Django avancé avec modélisation de données complexes et visualisations interactives
  • Gestion des relations Many-to-Many et développement de tableaux de bord analytiques en temps réel

💡 Mon premier projet Django qui m'a permis de décrocher mon premier contrat d'alternance grâce à la démonstration de mes compétences en développement backend Python.


TLDR - Résumé Exécutif

Plateforme Django développée pour simplifier la collecte et la visualisation des questionnaires de satisfaction étudiante à l'école EPSI. Remplace le système Excel/Google Forms fragmenté par une interface unifiée avec tableaux de bord interactifs.

Technologies Principales

DomaineTechnologies
BackendPythonDjangoSQLiteChart.js
FrontendHTML5CSS3JavaScriptBootstrap
DonnéesVisualisations graphiquesAnalyticsExport CSV

Réalisations Techniques Clés

#RéalisationImpact
1Interface de sondage unifiéeRéduction de 80% du temps de réponse étudiant
2Tableaux de bord analytiques en temps réelVisualisation instantanée des tendances satisfaction
3Architecture responsive multi-deviceAccessibilité mobile et desktop optimisée
Défi Technique Majeur

Intégration de données hétérogènes : Consolidation de multiples sources Google Forms en une base de données cohérente avec Django ORM, gestion des relations Many-to-Many entre étudiants, cours et évaluations.

Compétences Démontrées

  • Backend Python/Django : Architecture MVC, ORM, authentification
  • Visualisation de données : Chart.js, dashboards interactifs
  • UX/UI Design : Interface responsive, amélioration workflow utilisateur
  • Gestion de base de données : Modélisation relationnelle, optimisation requêtes

1. Vue d'ensemble et Objectif du Projet

Problématique Adressée

L'école EPSI distribuait des questionnaires de satisfaction via Excel avec des liens Google Forms séparés pour chaque cours. Les étudiants devaient cliquer sur chaque lien individuellement, rendant le processus fastidieux et réduisant le taux de participation.

Public Cible et Cas d'Usage

UtilisateurBesoinSolution Apportée
ÉtudiantsRépondre rapidement aux questionnairesInterface unifiée, saisie continue
AdministrationAnalyser la satisfaction par coursTableaux de bord temps réel
ProfesseursComprendre l'évaluation de leurs coursVisualisations détaillées par matière

Métriques du Projet

MétriqueValeurDétail
Cours évalués20+Toutes les matières du cursus EPSI
Étudiants participants150+Taux de participation augmenté de 60%
Questions par questionnaire8-12Satisfaction, difficulté, pédagogie
Temps de réponse moyen<3 minVs 15+ min avec l'ancien système
Visualisations générées5 typesGraphiques circulaires, barres, tendances

2. Architecture Backend

Technologies Backend Utilisées

ComposantTechnologieVersionRôle
FrameworkDjango4.0Architecture MVC, ORM, authentification
LangagePython3.9Logique métier et traitement données
Base de donnéesSQLite3.xStockage relationnel, développement
ORMDjango ORM-Mapping objet-relationnel

Implémentation Backend

Modèles de données Django
dashboard/models.py
class Course(models.Model):
name = models.CharField(max_length=100)
professor = models.CharField(max_length=100)
semester = models.CharField(max_length=20)
created_at = models.DateTimeField(auto_now_add=True)

class Student(models.Model):
email = models.EmailField(unique=True)
promotion = models.CharField(max_length=20)
year = models.IntegerField()

class Survey(models.Model):
student = models.ForeignKey(Student, on_delete=models.CASCADE)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
satisfaction_rating = models.IntegerField(choices=[(i, i) for i in range(1, 6)])
difficulty_rating = models.IntegerField(choices=[(i, i) for i in range(1, 6)])
content_quality = models.IntegerField(choices=[(i, i) for i in range(1, 6)])
teaching_method = models.IntegerField(choices=[(i, i) for i in range(1, 6)])
# Modèle optimisé avec contraintes d'intégrité
class Meta:
unique_together = ('student', 'course')

3. Architecture Frontend

Technologies Frontend Utilisées

ComposantTechnologieRôle
TemplatesDjango TemplatesRendu HTML dynamique
StylingBootstrap 5CSS3Design responsive
InteractionsJavaScriptjQueryLogique client
VisualisationsChart.jsGraphiques interactifs

Implémentation Frontend

Interface de questionnaire dynamique
static/js/survey.js
// Soumission AJAX pour expérience fluide
function submitSurvey(courseId) {
const formData = new FormData(document.getElementById('surveyForm'));

fetch(`/survey/submit/${courseId}/`, {
method: 'POST',
body: formData,
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
showSuccessMessage();
loadNextCourse(); // Navigation fluide
}
});
}

// Navigation automatique entre cours
function loadNextCourse() {
const nextCourseButton = document.querySelector('.next-course');
if (nextCourseButton) {
nextCourseButton.click();
}
}

4. Points Forts Techniques

Visualisations et Fonctionnalités Principales

FonctionnalitéComplexitéTechnologie
Dashboard temps réel⭐⭐⭐Chart.js + Django
Graphiques par cours⭐⭐Canvas API
Export analytics⭐⭐Python CSV
Interface responsive⭐⭐⭐Bootstrap Grid
Optimisations de Performance

Optimisations Base de Données

  • Requêtes optimisées : Utilisation de select_related() et prefetch_related()
  • Indexation : Index composites sur (student_id, course_id)
  • Agrégations : Calculs statistiques directement en SQL

Optimisations Frontend

  • Lazy loading : Chargement différé des graphiques
  • Cache statique : CDN pour Chart.js et Bootstrap
  • Minification : CSS et JS compressés pour production

Excellence Technique

AspectImplémentationBénéfice
Architecture MVCSéparation claire modèles/vues/contrôleursMaintenabilité élevée
Validation donnéesForms Django + validation JavaScriptIntégrité garantie
Responsive DesignBootstrap + media queries customUX optimale tous devices
SécuritéCSRF protection + authentification DjangoProtection des données

5. Architecture et Décisions de Conception

Architecture des Composants

SurveyForm/
├── surveyepsi/ # Projet Django principal
│ ├── dashboard/ # App principale
│ │ ├── models.py # Modèles de données
│ │ ├── views.py # Contrôleurs
│ │ ├── forms.py # Formulaires Django
│ │ └── templates/ # Templates HTML
│ ├── static/ # Assets statiques
│ │ ├── css/ # Styles custom
│ │ ├── js/ # Scripts Chart.js
│ │ └── img/ # Images interface
│ └── config/ # Configuration Django
└── ScreenShot/ # Documentation visuelle

Patterns de Conception Clés

PatternImplémentationAvantages
MVC DjangoModels/Views/Templates séparésMaintenabilité, réutilisabilité
Repository PatternDjango ORM comme couche d'abstractionFlexibilité base de données
Observer PatternSignaux Django pour notificationsCouplage faible entre composants

6. Résultats et Impact

Réalisations Techniques Quantifiées

Amélioration UX : Réduction de 80% du temps de complétion des questionnaires (15min → 3min)

Performance et Adoption

Taux de participation : Augmentation de 60% du taux de réponse étudiant grâce à l'interface simplifiée

Innovation Pédagogique

Feedback temps réel : Visualisations instantanées permettant aux professeurs d'ajuster leurs méthodes

Métriques de Performance Détaillées

IndicateurAvantAprèsAmélioration
Temps de réponse15+ minutes3 minutes-80%
Taux de participation40%64%+60%
Questionnaires complétés65%92%+42%
Satisfaction utilisateur2.3/54.2/5+83%

Expérience Utilisateur

AspectImplémentationRésultat
Navigation fluideInterface one-page avec AJAXPas de rechargement page
Feedback visuelBarres de progression, animationsEngagement utilisateur accru
Responsive designAdaptation mobile parfaiteUtilisation nomade facilitée

7. Exemples de Code

Code Backend Principal

dashboard/views.py
from django.shortcuts import render
from django.http import JsonResponse
from django.db.models import Avg, Count
from .models import Course, Survey

def dashboard_analytics(request):
"""
Vue principale du tableau de bord avec agrégations optimisées
"""
# Agrégation des données de satisfaction par cours
course_stats = Course.objects.annotate(
avg_satisfaction=Avg('survey__satisfaction_rating'),
response_count=Count('survey'),
avg_difficulty=Avg('survey__difficulty_rating')
).order_by('-avg_satisfaction')

# Préparation des données pour Chart.js
chart_data = {
'labels': [course.name for course in course_stats],
'satisfaction': [float(course.avg_satisfaction or 0) for course in course_stats],
'participation': [course.response_count for course in course_stats]
}

context = {
'courses': course_stats,
'chart_data': chart_data,
'total_responses': Survey.objects.count()
}

return render(request, 'dashboard/analytics.html', context)

Code Frontend Principal

static/js/dashboard.js
// Initialisation des graphiques Chart.js avec données Django
document.addEventListener('DOMContentLoaded', function() {
const chartData = JSON.parse(document.getElementById('chart-data').textContent);

// Graphique satisfaction par cours
const satisfactionChart = new Chart(document.getElementById('satisfactionChart'), {
type: 'bar',
data: {
labels: chartData.labels,
datasets: [{
label: 'Satisfaction Moyenne',
data: chartData.satisfaction,
backgroundColor: 'rgba(54, 162, 235, 0.8)',
borderColor: 'rgba(54, 162, 235, 1)',
borderWidth: 1
}]
},
options: {
responsive: true,
scales: {
y: {
beginAtZero: true,
max: 5,
ticks: {
stepSize: 0.5
}
}
}
}
});
});